package com.vernhe;

public abstract class AbstractList<E> implements List<E>{
    protected int size;

    @Override
    public int size() {
        return size;
    }

    @Override
    public boolean isEmpty() {
        return size == 0;
    }

    @Override
    public void add(E element) {
        /**
         * 最好：O(1)
         * 最坏：O(N) 发生扩容，会遍历数组
         * 平均：O(1)
         * 经过多次复杂度比较低的情况后，出现个别复杂度比较高的情况，使用均摊，
         * 在这里即将后面发生扩容时N次的遍历均摊到前面每次Add中去
         * 均摊：O(1)
         */
        add(size,element);
    }

    @Override
    public boolean contains(E element) {
        return indexOf(element) != ELEMENT_NOT_FOUND;
    }

    public void outOfBounds(int index) {
        throw new IndexOutOfBoundsException("Index:" + index + "，Size:" + size);
    }

    public void rangeCheck(int index) {
        if (index < 0 || index >= size) {
            outOfBounds(index);
        }
    }

    public void rangeCheckForAdd(int index) {
        //允许为size
        if (index < 0 || index > size) {
            outOfBounds(index);
        }
    }

}
